/*
 * TacticaBernabe.java
 *
 * Created on 1 de abril de 2007, 3:24
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.PaneteTeam;
import futbol.General;
import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;
/**
 *
 * @author Java
 */
public class TacticaBernabe implements Tactica{
    
    /** Creates a new instance of TacticaBernabe */
    public TacticaBernabe() {
    }
    private int nValores[][]={
        
        {-150,0,5},  // Jugador 1[0]
        {-110,-60,6},  // Jugador 2[1]
        {-110,60,6},  // Jugador 3[2]
        {-80,-0,6},  // Jugador 4[3]
        {-60,50,6},  // Jugador 5[4]
        {-60,-50,6},  // Jugador 6[5]
        {0,0,6},  // Jugador 7[6]
        {130,-80,6},  // Jugador 8[7]
        {130,80,6},  // Jugador 9[8]
        {75,35,6},  // Jugador 10[9]
        {75,-35,6}  // Jugador 11[10]
        
    };
    
    public Color getColor1() {
        return Color.red;
    }
    
    public Color getColor2() {
        return Color.red;
    }
    
    public Color getColorNumero() {
        return Color.green;
    }
    
    public String getNombre() {
        return "Panete Team";
    }
    
    public int getXInicial(int n) {
        return nValores[n][0];
    }
    
    public int getYInicial(int n) {
        return nValores[n][1];
    }
    
    public int getFuerza(int n) {
        return nValores[n][2];
    }
    
    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));
        
        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();
        //array para saber los contrarios que ya han sido marcados
        int array[] = new int[11];
        for (int i=0;i<11;++i){
            array[i]=0;
            // System.out.println(""+array[i]);
        }
        //Movimiento portero
        
        int y=(int)(bola.getY()/2);
        if (y<-20) y=-20;
        if (y>20) y=20;
        
        com.add(new ComandoIrA(0,nValores[0][0], y));
        
        //Mejorar defensa
        boolean cierto=true;
        if (!sj.estoyMasCercaDeBola() || bola.getX()<0){
            
            //se ponen por delante del atacante
            for (int n=1;n<6;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                //para que solo marque un defensa a un jugador
                for(int j=0;j<11 && cierto;++j){
                    if(array[j]==nJC){
                        cierto=false;
                    }
                }
                if(cierto){
                    //para que rodee al jugador
                    if(bola.getX()<jugadores[n].getX()){
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()-10, contrarios[nJC].getY()+10));
                        }else{
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()-10, contrarios[nJC].getY()-10));
                        }
                    }else{
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()+10));
                        }else{
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()-10));
                        }
                    }
                    array[n]=nJC;
                }else {
                    //los que no marcan se mueven un poco de arriba a abajo y de izquierda a derecha
                    cierto=true;
                    if(bola.getX()<jugadores[n].getX()){
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, nValores[n][0]-20, nValores[n][1]+20));
                        }else{
                            com.add(new ComandoIrA(n, nValores[n][0]-20, nValores[n][1]-20));
                        }
                    }else{
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, nValores[n][0]+20, nValores[n][1]+20));
                        }else{
                            com.add(new ComandoIrA(n, nValores[n][0]+20, nValores[n][1]-20));
                        }
                    }
                }
            }
            for (int n=6;n<11;n++){
                //se ponen por delante del defensor
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                //para que solo marque un defensa a un jugador
                for(int j=0;j<11 && cierto;++j){
                    if(array[j]==nJC){
                        cierto=false;
                    }
                }
                if(cierto){
                    //para que rodee al jugador
                    if(bola.getX()>jugadores[n].getX()){
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()+10));
                        }else{
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()-10));
                        }
                    }else{
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()-10, contrarios[nJC].getY()+10));
                        }else{
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()-10, contrarios[nJC].getY()-10));
                        }
                    }
                    array[n]=nJC;
                }else {
                    //los que no marcan se mueven un poco de arriba a abajo y de izquierda a derecha
                    cierto=true;
                    if(bola.getX()<jugadores[n].getX()){
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, nValores[n][0]+20, nValores[n][1]+20));
                        }else{
                            com.add(new ComandoIrA(n, nValores[n][0]+20, nValores[n][1]-20));
                        }
                    }else{
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, nValores[n][0]-20, nValores[n][1]+20));
                        }else{
                            com.add(new ComandoIrA(n, nValores[n][0]-20, nValores[n][1]-20));
                        }
                    }
                }
            }
        } else {
            
            for (int n=6;n<11;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                //para que solo marque un defensa a un jugador
                for(int j=0;j<11 && cierto;++j){
                    if(array[j]==nJC){
                        cierto=false;
                    }
                }
                if(cierto){
                    if(bola.getX()>jugadores[n].getX()){
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()+10));
                        }else{
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()-10));
                        }
                    }else{
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()-10, contrarios[nJC].getY()+10));
                        }else{
                            com.add(new ComandoIrA(n, contrarios[nJC].getX()-10, contrarios[nJC].getY()-10));
                        }
                    }
                    array[n]=nJC;
                }else {
                    //los que no marcan se mueven un poco de arriba a abajo y de izquierda a derecha
                    cierto=true;
                    if(bola.getX()<jugadores[n].getX()){
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, nValores[n][0]+20, nValores[n][1]+20));
                        }else{
                            com.add(new ComandoIrA(n, nValores[n][0]+20, nValores[n][1]-20));
                        }
                    }else{
                        if(bola.getY()>jugadores[n].getY()){
                            com.add(new ComandoIrA(n, nValores[n][0]-20, nValores[n][1]+20));
                        }else{
                            com.add(new ComandoIrA(n, nValores[n][0]-20, nValores[n][1]-20));
                        }
                    }
                }
            }
        }
        
        //Movimiento mas cercano a la bola
        int nJug=sj.getMasCercanoDeBola();
       /* if(nJug==0){
             com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
        }else{*/
        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
        //}
        
        lanzarBolaMejor(sj, com);
        
        return com;
    }
    
    
    private void lanzarBolaMejor(SituacionJugadores sj, Vector<Comando> com){
        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        double res;
        int r;
        
        for (int n=0;n<11;n++){
            if(bola.getY()>=0){
                //calculo el angulo de desvio
                res=(bola.getY()-18)/(160-bola.getX());
                //le hago el arcotangente
                res=Math.atan(res);
                //lo paso a grados normales
                res=Math.toDegrees(res);
                //lo paso a entero
                r=(int)res;
                if(r>0) r=r*-1;
            }else{
                res=(bola.getY()+18)/(160-bola.getX());
                res=Math.atan(res);
                res=Math.toDegrees(res);
                r=(int)res;
                if(r<0) r=r*-1;
            }
            //System.out.println(""+res);
            com.add(new ComandoTiroAPuerta(n,r));
        }
      }   
        
    
}
